﻿namespace System.Collections.Generic
{
    /// <summary>Методы расширения для интерфейса списка</summary>
    public static class IListExtentions
    {
        ///<summary>Метод расширения для инициализации списка</summary>
        ///<param name="list">Инициализируемый объект</param>
        ///<param name="Count">Требуемое число элементов</param>
        ///<param name="Initializator">Метод инициализации</param>
        ///<param name="ClearBefore">Очищать предварительно (по умолчанию)</param>
        ///<typeparam name="T">Тип элементов списка</typeparam>
        ///<returns>Инициализированный список</returns>
        [Diagnostics.DebuggerStepThrough]
        public static IList<T> Initialize<T>(this IList<T> list, int Count, Func<int, T> Initializator, bool ClearBefore = true)
        {
            if(list is List<T>)
            {
                var lv_List = (List<T>)list;
                if(ClearBefore) lv_List.Clear();
                for(var i = 0; i < Count; i++) lv_List.Add(Initializator(i));
            }
            else
            {
                if(ClearBefore) list.Clear();
                for(var i = 0; i < Count; i++) list.Add(Initializator(i));
            }
            return list;
        }


        /// <summary>Перемешать список</summary>
        /// <param name="list">Перемешиваемый список</param>
        /// <typeparam name="T">Тип элементов списка</typeparam>
        /// <returns>Перемешанный исходный список</returns>
        public static IList<T> Mix<T>(this IList<T> list)
        {
            var rnd = new Random();

            if(list is List<T>)
            {
                var lv_List = (List<T>)list;
                var length = lv_List.Count - 1;
                var temp = lv_List[0];
                var index = 0;
                for(var i = 1; i <= length; i++)
                    lv_List[index] = lv_List[index = rnd.Next(length)];
                lv_List[index] = temp;
            }
            else
            {
                var length = list.Count - 1;
                var temp = list[0];
                var index = 0;
                for(var i = 1; i <= length; i++)
                    list[index] = list[index = rnd.Next(length)];
                list[index] = temp;
            }
            return list;
        }
    }
}
